#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#define NUM 64 // 阈值 4kb

int main()
{
    int pipefd[2] = {0};
    if(pipe(pipefd) != 0) {
        perror("pipe error!");
        return 1;
    }
    printf("pipefd[0]: %d\n", pipefd[0]); //fd = 3 读取
    printf("pipefd[1]: %d\n", pipefd[1]); //fd = 4 写入
    if(fork() == 0) {
        // child
        close(pipefd[0]);
        const char* msg = "hello 你好";
        while(1) {
            write(pipefd[1], msg, strlen(msg));
            //sleep(10);
            //break;
        }
        close(pipefd[1]);
        exit(0);
    }
    // parent
    close(pipefd[1]);
    sleep(10);
    while(1) {
        char c[NUM] = {0};
        ssize_t s = read(pipefd[0], c, sizeof(c));
        
        if(s > 0) {
            c[s] = 0;
            printf("father take :%s\n", c);
        }else if(s == 0) {
            printf("write quit..\n");
            break;
        }else {
            break;
        }
        break;
        
    }
    close(pipefd[0]);
    int status = 0;
    waitpid(-1, &status, 0);
    printf("exit code:%d\n", (status>>8) & 0xFF);
    printf("exit signal:%d\n", status & 0x7F);
    // int pipefd[2] = {0};
    // if(pipe(pipefd) != 0) {
    //     perror("pipe error!");
    //     return 1;
    // }
    // printf("pipefd[0]: %d\n", pipefd[0]); //fd = 3 读取
    // printf("pipefd[1]: %d\n", pipefd[1]); //fd = 4 写入
    // if(fork() == 0) {
    //     // child
    //     close(pipefd[0]); // 子进程向pipe最多写入65536字节数据
    //     char c = 'a';
    //     int count = 0;
    //     while(1) {
    //         write(pipefd[1], &c, 1);
    //         count++;
    //         printf("count : %d\n", count);
    //     }
    //     exit(0);
    // }
    // // parent
    // close(pipefd[1]);
    // while(1) {
    //     sleep(10); // 子进程写满pipe后,父进程读取至少4kb(阈值)后，子进程才会再次写入字节数据
    //     char c[NUM] = {0};
    //     ssize_t s = read(pipefd[0], c, sizeof(c));
    //     c[s] = 0;
    //     printf("father take :%c\n", c[0]);
    // }




    // int pipefd[2] = {0};
    // if(pipe(pipefd) != 0) {
    //     perror("pipe error!");
    //     return 1;
    // }
    // printf("pipefd[0]: %d\n", pipefd[0]); //fd = 3 读取
    // printf("pipefd[1]: %d\n", pipefd[1]); //fd = 4 写入
    // if(fork() == 0) {
    //     // child
    //     close(pipefd[0]);
    //     const char* msg = "hello hql\n";
    //     while(1) {
    //         write(pipefd[1], msg, strlen(msg));
    //         sleep(1);
    //     }
    //     exit(0);
    // }
    // // parent
    // close(pipefd[1]);
    // char* buff[NUM] = {0};
    // while(1) {
    //     ssize_t s = read(pipefd[0], buff, sizeof(buff));
    //     if(s == 0) {
    //         break;
    //     }
    //     else if(s > 0) {
    //         buff[s] = 0;
    //         printf("message of child is : %s", buff);
            
    //     }
    //     else {
    //         break;
    //     }
    // }


    return 0;
}

